home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NOVA - For the NeXT Workstation
/
NOVA - For the NeXT Workstation.iso
/
Apps
/
Graphics
/
Others
/
BitmapTest
/
MovingBitmap.m
< prev
next >
Wrap
Text File
|
1992-12-25
|
5KB
|
128 lines
/***************************************************************************/
/* MovingBitmap.m - interface file for MovingBitmap class */
/* January 1990 Carl F. Sutter */
/***************************************************************************/
#import "MovingBitmap.h"
#import <dpsclient/dpsclient.h> // for NX_COPY or other compositing op
#import <dpsclient/psops.h> // for PSsetgray
#import <dpsclient/wraps.h> // for PScompositerect
#import <appkit/nextstd.h> // for MIN and MAX
#import <time.h> // for time
#import <stdlib.h> // for rand and srand
@implementation MovingBitmap
/***************************************************************************/
/* initFromMachO:inFrame: - make a new bitmap from the given name */
/***************************************************************************/
- initFromMachO:(const char *)tiffFile inFrame:(NXRect *)limits;
{
[super init];
bmpPiece = [NXImage findImageNamed:tiffFile];
[bmpPiece getSize:&nxsPiece];
srand( time( 0 ) ); /* randomize the random number generator */
flXVel = (float)((rand() % 11) - 5);
flYVel = (float)((rand() % 11) - 5);
flXPos = flOldXPos = limits->size.width / 2.0;
flYPos = flOldYPos = limits->size.height / 2.0;
[self setFrame:limits];
return( self );
} /* newFromMachO:inFrame: 1/25/90 CFS */
/***************************************************************************/
/* setFrame: - set the new bounds for the bitmap's world */
/***************************************************************************/
- setFrame:(NXRect *)nxrFrame
{
nxrLimits = *nxrFrame;
nxrLimits.size.width -= nxsPiece.width;
nxrLimits.size.height -= nxsPiece.height;
/* if the bitmap is out of the view, move it to the nearest edge */
flXPos = MIN( NX_MAXX( &nxrLimits ), MAX( NX_X( &nxrLimits ), flXPos ) );
flYPos = MIN( NX_MAXY( &nxrLimits ), MAX( NX_Y( &nxrLimits ), flYPos ) );
return( self );
} /* setFrame: 1/25/90 CFS */
/***************************************************************************/
/* setPosition:: - set the current position of the bitmap */
/***************************************************************************/
- setPosition:(float)xPos :(float)yPos
{
flXPos = xPos;
flYPos = yPos;
return( self );
} /* setPosition:: 1/25/90 CFS */
/***************************************************************************/
/* setVelocity:: - set the current velocity of the bitmap */
/***************************************************************************/
- setVelocity:(float)xVel :(float)yVel
{
flXVel = xVel;
flYVel = yVel;
return( self );
} /* setVelocity:: 1/25/90 CFS */
/***************************************************************************/
/* move - move the bitmap by one velocity step, bounce off of walls if hit */
/***************************************************************************/
- move
{
/* save current position for erasing */
flOldXPos = flXPos;
flOldYPos = flYPos;
/* move one velocity step */
flXPos += flXVel;
flYPos += flYVel;
/* bounce off of a vertical wall if there is a collision */
if ((flXPos < NX_X( &nxrLimits )) || (flXPos > NX_MAXX( &nxrLimits )))
{
flXPos -= flXVel;
flXVel = -flXVel;
}
/* bounce off of a horizontal wall if there is a collision */
if ((flYPos < NX_Y( &nxrLimits )) || (flYPos > NX_MAXY( &nxrLimits )))
{
flYPos -= flYVel;
flYVel = -flYVel;
}
return( self );
} /* move 1/25/90 CFS */
/***************************************************************************/
/* erase - erase the areas under the old bitmap positions */
/* PScompositerect just fills a rectangle with the current color & alpha */
/***************************************************************************/
- erase
{
NXRect nxrFill = { flOldXPos, flOldYPos, nxsPiece.width, nxsPiece.height };
PSsetgray( NX_LTGRAY );
PSsetalpha( 1 ); /* opaque */
PScompositerect( flOldXPos, flOldYPos, nxsPiece.width, nxsPiece.height, NX_SOVER );
return( self );
} /* erase 1/25/90 CFS */
/***************************************************************************/
/* draw - composite the bitmap to the screen */
/***************************************************************************/
- draw
{
/* use floor to make the bitmap draw on a unit edge, otherwise it might */
/* spill over by one pixel */
NXPoint nxpPosition = { floor(flXPos), floor(flYPos) };
[bmpPiece composite:NX_SOVER toPoint:&nxpPosition];
return( self );
} /* draw 1/25/90 CFS */
@end